/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.reportes;

import com.camachosanchez.bean.ControlReencauche;
import com.camachosanchez.bean.DetalleControlReencauche;
import com.camachosanchez.util.GUIUtil;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.ReportUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.swing.JOptionPane;

/**
 *
 * @author Zully
 */
public class ReporteReencauches {

    private EntityManagerFactory emf;
    private EntityManager em;

    public ReporteReencauches() {
        emf = JPAUtil.getEntityManagerFactory();
        em = emf.createEntityManager();
    }

    public void generarReporte(Date fechaIni, Date fechaFin) {
        Document document = new Document(PageSize.A4.rotate(), 0, 0, 30, 30);
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat formatterName = new SimpleDateFormat("ddMMyyyy");
            String nombrePdf = "reportes/reencauches_" + formatterName.format(fechaIni) + "-" + formatterName.format(fechaFin) + ".pdf";
            PdfWriter.getInstance(document, new FileOutputStream(nombrePdf));
            document.open();
            PdfPTable tablaC = new PdfPTable(1);
            tablaC.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaC.setWidthPercentage(100);

            PdfPCell celda = new PdfPCell(new Paragraph("GASTOS EN REENCAUCHES: " + formatter.format(fechaIni) + " - " + formatter.format(fechaFin),
                    FontFactory.getFont(BaseFont.HELVETICA, 12, Font.NORMAL, BaseColor.BLACK)));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setBorder(Rectangle.NO_BORDER);
            tablaC.addCell(celda);
            document.add(tablaC);

//            float[] anchoColsR = {0.25f, 0.55f, 0.3f, 0.25f, 0.3f, 0.3f, 0.3f, 0.25f};
            PdfPTable tablaReencauches = new PdfPTable(10);
            tablaReencauches.setWidthPercentage(96);
            tablaReencauches.setSpacingBefore(10f);

            tablaReencauches.addCell(ReportUtil.getCelda("ENVÍO", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("DISTRIBUIDOR", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("GUÍA DE REMISIÓN", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("Nº FACTURA", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("RECEPCIÓN", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("CÓDIGO", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("MARCA", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("NUEVA BANDA", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("PRECIO (S/.)", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            tablaReencauches.addCell(ReportUtil.getCelda("GARANTÍA", 1, 1, BaseColor.WHITE, 1, 0.5f, 8, 1));
            PdfPTable tablaTotales = new PdfPTable(9);
            tablaTotales.setWidthPercentage(96);
            tablaTotales.setSpacingBefore(10f);
            List<ControlReencauche> datos = this.getDatos(fechaIni, fechaFin);
            if (datos != null) {
                SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
                String valorR;
                int totalEnviados = 0, totalRecepcionados = 0, totalNoRec = 0, totalGarantia = 0;
                double totalPrecio = 0;
                BaseColor color;
                for (ControlReencauche reencauche : datos) {
                    List<DetalleControlReencauche> detalle = reencauche.getDetalleControlReencaucheList();
                    int cantDetalle = 0;
                    for(DetalleControlReencauche item : detalle){
                        if(item.getEstado()){
                            cantDetalle ++;
                        }
                    }
                    valorR = (reencauche.getFechaEnvio() == null) ? "" : formatoDeFecha.format(reencauche.getFechaEnvio());
                    tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, cantDetalle, BaseColor.WHITE, 1, 0.5f, 9, 0));
                    valorR = (reencauche.getIdDistribuidorNeumaticos() == null) ? "" : reencauche.getIdDistribuidorNeumaticos().getNombre();
                    tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, cantDetalle, BaseColor.WHITE, 0, 0.5f, 9, 0));
                    valorR = (reencauche.getNumGuiaRemision() == null) ? "" : reencauche.getNumGuiaRemision();
                    tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, cantDetalle, BaseColor.WHITE, 0, 0.5f, 9, 0));
                    for (DetalleControlReencauche item : detalle) {
                        if(item.getEstado()){//si no ha sido cancelado
                            color = BaseColor.WHITE;
                            if (item.getFechaRecepcion() != null) { //si ya fueron recepcionados en una fecha
                                totalRecepcionados++;
                                totalPrecio += (item.getPrecio() == null) ? 0 : item.getPrecio();
                            } else {
                                totalNoRec++;
                            }
                            valorR = (item.getNumFactura() == null) ? "" : item.getNumFactura();
                            tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, 1, BaseColor.WHITE, 0, 0.5f, 9, 0));
                            valorR = (item.getFechaRecepcion() == null) ? "" : formatoDeFecha.format(item.getFechaRecepcion());
                            tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, 1, BaseColor.WHITE, 1, 0.5f, 9, 0));
                            valorR = (item.getIdNeumatico() == null) ? "" : item.getIdNeumatico().getCodigo();
                            tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, 1, color, 0, 0.5f, 9, 0));
                            valorR = (item.getIdNeumatico() == null) ? "" : item.getIdNeumatico().getIdMarca().getNombre();
                            tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, 1, color, 0, 0.5f, 9, 0));
                            valorR = (item.getIdNuevoTipoBanda() == null) ? "" : item.getIdNuevoTipoBanda().getNombre().trim();
                            tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, 1, color, 0, 0.5f, 9, 0));
                            valorR = (item.getPrecio() == null) ? "" : item.getPrecio() + "";
                            tablaReencauches.addCell(ReportUtil.getCelda(GUIUtil.formatearNumero(valorR), 1, 1, color, 2, 0.5f, 9, 0));
                            valorR = "";
                            if(item.getPorGarantia()){
                                valorR = "Sí";
                                totalGarantia++;
                            }
                            tablaReencauches.addCell(ReportUtil.getCelda(valorR, 1, 1, color, 1, 0.5f, 9, 0));
                            totalEnviados++;
                        }
                    }
                }

                tablaReencauches.addCell(ReportUtil.getCelda("Total Precio Neumáticos Recepcionados ($.)", 8, 1, BaseColor.WHITE, BaseColor.BLACK, 2, 0.5f, 9, 0));
                tablaReencauches.addCell(ReportUtil.getCelda(GUIUtil.formatearNumero(totalPrecio), 1, 1, BaseColor.WHITE, BaseColor.BLACK, 2, 0.5f, 9, 1));

                tablaTotales.addCell(ReportUtil.getCelda("Total de Neumáticos Enviados a Reencauche", 8, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));
                tablaTotales.addCell(ReportUtil.getCelda("" + totalEnviados, 1, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));

                tablaTotales.addCell(ReportUtil.getCelda("Total de Neumáticos Recepcionados", 8, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));
                tablaTotales.addCell(ReportUtil.getCelda("" + totalRecepcionados, 1, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));

                tablaTotales.addCell(ReportUtil.getCelda("Total de Neumáticos No Recepcionados", 8, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));
                tablaTotales.addCell(ReportUtil.getCelda("" + totalNoRec, 1, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));
                
                tablaTotales.addCell(ReportUtil.getCelda("Total de Neumáticos Enviados por Garantía", 8, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));
                tablaTotales.addCell(ReportUtil.getCelda("" + totalGarantia, 1, 1, BaseColor.WHITE, 2, 0.5f, 9, 0));
            }
            document.add(tablaReencauches);
            document.add(tablaTotales);
            document.close();
//            Runtime.getRuntime().exec ("cmd.exe /c start " + nombrePdf);
            File pdfFile = new File(nombrePdf);
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(pdfFile);
            } else {
                JOptionPane.showMessageDialog(null, "No se puede abrir el reporte.", "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
            }

        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    private List<ControlReencauche> getControlReencauche(List<DetalleControlReencauche> lista){
        List<ControlReencauche> controles = new ArrayList<ControlReencauche>();
       // List<DetalleControlReencauche> detalle = new ArrayList<DetalleControlReencauche>();
        if(!lista.isEmpty()){
            Integer id = lista.get(0).getIdControlReencauche().getId();
            DetalleControlReencauche temp = lista.get(0);
            for(DetalleControlReencauche item : lista){
                if(!id.equals(item.getIdControlReencauche().getId())){
                    ControlReencauche cotrol = temp.getIdControlReencauche();
                    /*cotrol.setDetalleControlReencaucheList(detalle);
                    detalle = new ArrayList<DetalleControlReencauche>();*/
                    controles.add(cotrol);
                } 
                //detalle.add(item);
                id = item.getIdControlReencauche().getId();
                temp = item;
            }
            ControlReencauche cotrol = temp.getIdControlReencauche();
            //cotrol.setDetalleControlReencaucheList(detalle);
            controles.add(cotrol);
        }
        return controles;
    }
            
    private List<ControlReencauche> getDatos(Date fechaIni, Date fechaFin) {
        java.sql.Date sqlFechaIni = new java.sql.Date(fechaIni.getTime());
        java.sql.Date sqlFechaFin = new java.sql.Date(fechaFin.getTime());
        try{
            Query q1 = em.createQuery("SELECT D FROM DetalleControlReencauche D"
                    + " WHERE D.fechaRecepcion IS NOT NULL AND D.fechaRecepcion <= :fechaFin AND D.fechaRecepcion >= :fechaIni AND D.estado=1"
                    + " ORDER BY D.idControlReencauche.id, D.fechaRecepcion");
            q1.setParameter("fechaIni", sqlFechaIni);
            q1.setParameter("fechaFin", sqlFechaFin);
            List<DetalleControlReencauche> lista = q1.getResultList();
            return getControlReencauche(lista);
        } catch(Exception e){
            System.err.println(e.getMessage());
        }
        return null;
    }
}
